package stackDemo;

import java.util.Arrays;

//栈的实现
public class MyStack {
    public int[] elem;//存储栈的长度
    public int usedSize;
    public static final int DEFAULT_CAPACITY = 10;//默认栈的大小为10
    public MyStack(){
        this.elem = new int[DEFAULT_CAPACITY];
    }

    //1.往栈里面插入元素
    public void push(int val){
        //在插入元素之前,要先判断栈是否满了,满了需要通过使用数组里面的copyOf进行扩容
        if(isFull()){
            this.elem = Arrays.copyOf(elem,2*elem.length);//第一个参数表示拷贝的是elem这个数组
        }//如果未满,那么就直接往栈里面插入元素
        elem[usedSize++] = val;
    }

    //2.判断栈是否满了的函数实现
    public boolean isFull(){
        return usedSize == elem.length;
    }

    //3.删除栈里面的元素,只需要usedSize--,虽然元素还在栈里面,但是当我插入元素时,会把之前的元素覆盖掉
    public int pop(){
        if(isEmpty()){
        //  return -1; //因为pop的返回值本来就是数字,为了不让他和我们的下标搞混,所以我们可以写一个栈空异常,避免搞混
            throw new EmptyStackException("栈为空...");
        }
        int oldVal = elem[usedSize-1];
        usedSize--;
//      elem[usedSize] = null;  //如果是引用类型的弹出,需要将其置为空,但是由于这里是简单类型,所以不需要将栈的元素置为空,直接返回即可.
        return oldVal;//返回出栈元素
    }

    //4.判断栈是否为空  , 在删除栈里面的元素之前需要先判断栈是否为空
    public boolean isEmpty(){
        return usedSize == 0;
    }

    //5.返回栈顶元素-peek
    public int peek(){
        if(isEmpty()){
            throw new EmptyStackException("栈为空...");
        }
        return elem[usedSize-1];
    }
}
